package net.lab1024.sa.gateway.config;

import jakarta.annotation.PostConstruct;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 流量染色核心配置类
 * 从配置文件（application.yml/properties）读取参数，支持自定义染色规则
 */
@Data
@Configuration
@ConfigurationProperties(prefix = "traffic.dye") // 绑定配置文件前缀
public class TrafficDyeConfig {

    // ========================== 核心配置参数 ==========================
    /** 是否启用流量染色 */
    private boolean enabled = false;

    /** 染色标记的载体键名（如请求头 key：X-Traffic-Tag） */
    private String dyeKey = "X-Traffic-Tag";

    /** 默认染色值（未显式传递时使用） */
    private String defaultDyeValue = "";

    /** 是否允许下游服务覆盖染色值 */
    private boolean allowOverride = false;

    /** 染色标记传播规则（支持服务名模糊匹配，如 "order-*" 表示所有 order 开头的服务） */
    private List<String> propagationRules = new ArrayList<>();


    // ========================== 初始化与校验 ==========================

    /**
     * 初始化方法：设置默认值、校验参数合法性
     * 被 @PostConstruct 注解标记，在 Spring 容器加载配置后自动执行
     */
    @PostConstruct
    public void init() {
        // 1. 传播规则默认值处理：若未配置，默认全传播（"*" 表示所有服务）
        if (propagationRules.isEmpty()) {
            propagationRules.add("*");
        }

        // 2. 校验染色键（dyeKey）合法性：不允许为空或纯空格
        if (!StringUtils.hasText(dyeKey)) {
            throw new IllegalArgumentException("Traffic dye key cannot be empty or blank. Please check 'traffic.dye.dye-key' configuration.");
        }

        // 3. 日志打印配置信息（便于调试）
        if (enabled) {
            System.out.println("[TrafficDyeConfig] Traffic dyeing enabled. Dye key: " + dyeKey + ", Default value: " + defaultDyeValue + ", Propagation rules: " + propagationRules);
        }
    }

}